﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Proyecto7CAD.Properties;
using System.Configuration;
using System.Data;
using System.Data.Sql;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Proyecto7CAD.BDProyecto7DataSetTableAdapters;
using System.Collections;


namespace Proyecto7CAD
{
    public class ObjetoCAD
    {
        SqlConnection conexion = new SqlConnection(Settings.Default.BDProyecto7ConnectionString);

        public void insertarObjetoCAD(string nombreObjeto, int tipoObjeto, int ataqueObjeto, int defensaObjeto,
            int curacionObjeto, int precioObjeto, string descripcionObjeto, string imagenObjeto)
        {
            try
            {
                ObjetoTableAdapter objTableAdapter = new ObjetoTableAdapter();
                objTableAdapter.Insert(nombreObjeto, tipoObjeto, ataqueObjeto, defensaObjeto, curacionObjeto, precioObjeto, descripcionObjeto, imagenObjeto);
            }

            catch (Exception ex)
            {
                throw (ex);
            }
        }

        public void editarObjetoCAD(int id, string nombreObjeto, int tipoObjeto, int ataqueObjeto, int defensaObjeto,
            int curacionObjeto, int precioObjeto, string descripcionObjeto, string imagenObjeto)
        {
            try
            {
                ObjetoTableAdapter objTableAdapter = new ObjetoTableAdapter();
                objTableAdapter.Update(id, nombreObjeto, tipoObjeto, ataqueObjeto, defensaObjeto, curacionObjeto, precioObjeto, descripcionObjeto, imagenObjeto);
            }

            catch (Exception ex)
            {
                throw (ex);
            }
        }


        public void borrarObjetoCAD(int id)
        { 
            try
            {
                ObjetoTableAdapter objTableAdapter = new ObjetoTableAdapter();
                objTableAdapter.Delete(id);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public DataSet obtenerObjetosCAD()
        {
            try
            {
                DataSet bd = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("select * from Objeto", conexion);
                da.Fill(bd, "objeto");
                return bd;
            }

            catch (Exception ex)
            {
                DataSet bd = new DataSet();
                throw ex;
            }
        }

        public DataSet obtenerObjetoCAD(int id)
        {
            try
            {
                DataSet bd = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("select * from Objeto where idObjeto=" + id.ToString(), conexion);
                da.Fill(bd, "objeto");
                return bd;
            }
            catch(Exception ex)
            {
                throw ex;
            }
        
        }

        public DataTable buscarObjetosCAD(string filtro)
        {
            try
            {
                ObjetoTableAdapter objTA = new ObjetoTableAdapter();
                return objTA.buscarObjetosNombre(filtro);

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void insertarTipoCAD(string nuevoTipo)
        {
            try
            {
                TipoObjetoTableAdapter tipoObjetoTA = new TipoObjetoTableAdapter();
                tipoObjetoTA.Insert(nuevoTipo);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public DataTable obtenerObjetoNombre(string nombre, string nom_des)
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                DataSet bdvirtual = new DataSet();
                SqlDataAdapter da = null;
                if (nom_des == "nombre")
                {
                    da = new SqlDataAdapter("select * from objeto where nombreObjeto LIKE '%" + nombre + "%'", conex);
                }
                else if (nom_des == "descripcion")
                {
                    da = new SqlDataAdapter("select * from objeto where descripcionObjeto LIKE '%" + nombre + "%'", conex);
                }
                da.Fill(bdvirtual, "objeto");
                DataTable tabla = new DataTable();
                tabla = bdvirtual.Tables["objeto"];
                return tabla;
            }
            catch
            {
                DataTable tablavacia = new DataTable();
                return tablavacia;
            }
            finally
            {
                conex.Close();
            }
        }

        public void borrarTipoCAD(int id)
        {
            try
            {
                TipoObjetoTableAdapter tipoObjetoTA = new TipoObjetoTableAdapter();
                tipoObjetoTA.Delete(id);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public DataTable obtenerTipoObjetosCAD()
        {
            try
            {
                TipoObjetoTableAdapter tipoTA = new TipoObjetoTableAdapter();
                return tipoTA.obtenerTipoObjetos();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        //Obtiene el nombre del objeto que se pide por argumento
        public string obtenerNombreObjeto(int id)
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                DataSet bdvirtual = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("select nombreObjeto from objeto where idObjeto=" + id, conex);

                da.Fill(bdvirtual, "objeto");

                return bdvirtual.Tables["objeto"].Rows[0][0].ToString();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conex.Close();
            }
        }
        //Obtiene el objeto con maximo ataque de un usuario pasado por parametro
        public int obtenerMaxAtaque(int id)
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                conex.Open();
                SqlCommand comandoArma = new SqlCommand("SELECT MAX(Objeto.ataqueObjeto) AS Ataque FROM Objeto INNER JOIN ObjetoUsuario ON Objeto.idObjeto = ObjetoUsuario.idObjeto WHERE (ObjetoUsuario.idUsuario = " + id.ToString() + ") GROUP BY Objeto.idObjeto", conex);
                SqlDataReader drArma = comandoArma.ExecuteReader();
                drArma.Read();
                int aux;

                if (drArma.HasRows)
                {
                    aux = drArma.GetInt32(0);
                }
                else
                {
                    aux = 0;
                }
                drArma.Close();
                return aux;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conex.Close();
            }
        }
        //Obtiene el objeto con maxima defensa de un usuario pasado por parametro
        public int obtenerMaxDefensa(int id)
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                conex.Open();
                SqlCommand comandoArmadura = new SqlCommand("SELECT MAX(Objeto.defensaObjeto) AS Defensa FROM Objeto INNER JOIN ObjetoUsuario ON Objeto.idObjeto = ObjetoUsuario.idObjeto WHERE (ObjetoUsuario.idUsuario = " + id.ToString() + ") GROUP BY Objeto.idObjeto", conex);
                SqlDataReader drArmadura = comandoArmadura.ExecuteReader();
                drArmadura.Read();
                int aux;

                if (drArmadura.HasRows)
                {
                    aux = drArmadura.GetInt32(0);
                }
                else
                {
                    aux = 0;
                }
                drArmadura.Close();
                return aux;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conex.Close();
            }
        }
        // Obtiene el maximo de vida que se puede recuperar con una pocion 
        public int obtenerMaxCuracion(int id)
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                conex.Open();
                SqlCommand comandoPocion = new SqlCommand("SELECT MAX(Objeto.curacionObjeto) AS Curacion FROM Objeto INNER JOIN ObjetoUsuario ON Objeto.idObjeto = ObjetoUsuario.idObjeto WHERE (ObjetoUsuario.idUsuario = " + id.ToString() + " AND ObjetoUsuario.cantidad > 0) GROUP BY Objeto.idObjeto", conex);
                SqlDataReader drPocion = comandoPocion.ExecuteReader();
                drPocion.Read();
                int aux;

                if (drPocion.HasRows)
                {
                    aux = drPocion.GetInt32(0);
                }
                else
                {
                    aux = 0;
                }
                drPocion.Close();
                return aux;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conex.Close();
            }
        }

        // Resta en uno la cantidad de pociones que tiene el usuario 
        public void restarPocion(int id, int cantidad)
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                conex.Open();
                SqlCommand comandoPocion = new SqlCommand("UPDATE ObjetoUsuario SET cantidad = cantidad-1 WHERE idUsuario = "+id.ToString()+" AND idObjeto IN (SELECT idObjeto FROM Objeto WHERE curacionObjeto = "+cantidad.ToString()+")", conex);
                SqlDataReader drPocion = comandoPocion.ExecuteReader();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conex.Close();
            }
        }
    }
}
